package cn.mujiankeji.mbrowser.界面.标签页.源码

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Tab
import androidx.compose.material3.TabRow
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import cn.mujiankeji.mbrowser.app.应用接口
import cn.mujiankeji.mbrowser.界面.框架.主视图.标签页状态
import cn.mujiankeji.mbrowser.界面.组件.代码框.代码格式化类型
import cn.mujiankeji.mbrowser.界面.组件.代码框.代码格式化视图
import kotlinx.coroutines.launch
import org.json.JSONException
import org.json.JSONObject
import org.json.JSONTokener


/**
 * 使用临时缓存
 */
class 源码标签页状态(val 源码缓存标识 : String) : 标签页状态() {

    init {
        super.标题.value = "源码"
    }

    suspend fun 获取源码() : String{
        return 应用接口.取缓存(源码缓存标识)
    }
}


@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun 源码标签页实现(state : 源码标签页状态){
    // 源码内容
    var 源码内容 by remember { mutableStateOf("") }
    // 选中的标签索引：0=HTML, 1=JSON, 2=TXT
    var 选中标签索引 by remember { mutableStateOf(0) }
    // 标签列表
    val 标签列表 = listOf("HTML", "JSON", "TXT")
    // 协程作用域
    val 协程作用域 = rememberCoroutineScope()
    
    // 加载源码内容
    LaunchedEffect(Unit) {
        协程作用域.launch {
            源码内容 = state.获取源码()
            // 自动选择合适的标签
            选中标签索引 = 判断内容类型(源码内容)
        }
    }
    
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text("源码查看") },
                actions = {
                    // 标签选择栏
                    TabRow(
                        selectedTabIndex = 选中标签索引,
                        modifier = Modifier.fillMaxWidth(0.8f)
                    ) {
                        标签列表.forEachIndexed { 索引, 标签名 ->
                            Tab(
                                selected = 选中标签索引 == 索引,
                                onClick = { 选中标签索引 = 索引 },
                                text = { Text(标签名) }
                            )
                        }
                    }
                }
            )
        }
    ) { paddingValues ->
        Box(
            modifier = Modifier
                .padding(paddingValues)
                .fillMaxSize()
        ) {
            // 根据选中的标签显示不同的格式化内容
            when (选中标签索引) {
                0 -> HTML格式化(源码内容)
                1 -> JSON格式化(源码内容)
                2 -> 纯文本显示(源码内容)
            }
        }
    }
}

/**
 * 判断内容类型
 * @return 0=HTML, 1=JSON, 2=TXT
 */
private fun 判断内容类型(内容: String): Int {
    // 如果内容为空，默认为纯文本
    if (内容.isBlank()) return 2
    
    // 检查是否为HTML
    if (内容.trim().startsWith("<") && 
        (内容.contains("<!DOCTYPE html>", ignoreCase = true) || 
         内容.contains("<html", ignoreCase = true) ||
         内容.contains("<head", ignoreCase = true) ||
         内容.contains("<body", ignoreCase = true) ||
         内容.contains("<div", ignoreCase = true))
    ) {
        return 0
    }
    
    // 检查是否为JSON
    try {
        val trimmedContent = 内容.trim()
        if ((trimmedContent.startsWith("{") && trimmedContent.endsWith("}")) || 
            (trimmedContent.startsWith("[") && trimmedContent.endsWith("]"))) {
            JSONTokener(内容).nextValue()
            return 1
        }
    } catch (e: JSONException) {
        // 不是有效的JSON
    }
    
    // 默认为纯文本
    return 2
}

/**
 * HTML 格式化
 */
@Composable
fun HTML格式化(代码: String) {
    代码格式化视图(
        代码 = 代码,
        类型 = 代码格式化类型.HTML,
        modifier = Modifier.fillMaxSize()
    )
}

/**
 * JSON 格式化
 */
@Composable
fun JSON格式化(代码: String) {
    代码格式化视图(
        代码 = 代码,
        类型 = 代码格式化类型.JSON,
        modifier = Modifier.fillMaxSize()
    )
}

/**
 * 纯文本显示（不格式化）
 */
@Composable
fun 纯文本显示(文本: String) {
    val 滚动状态 = rememberScrollState()
    
    Text(
        text = 文本,
        style = TextStyle(
            fontFamily = FontFamily.Monospace,
            fontSize = 14.sp
        ),
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
            .verticalScroll(滚动状态)
    )
}